﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Devart.Data.PostgreSql;

namespace Sistema_financiero
{
    public partial class frm_Ver_Modificar_Prestamo : Form
    {
        public List<Entidades.Cuota> Lista_cuotas = new List<Sistema_financiero.Entidades.Cuota>();
        public List<Entidades.Pago> Lista_pagos = new List<Sistema_financiero.Entidades.Pago>();
        public List<Entidades.Pago> Lista_pagos_realizados = new List<Sistema_financiero.Entidades.Pago>();
        public List<Entidades.Pago> Lista_pagos_mas_realizados = new List<Sistema_financiero.Entidades.Pago>();
        public List<decimal> Listbox_pagos = new List<decimal>();
        public int id_prestamo;
        public List<Entidades.Cliente> Lista_garantes = new List<Sistema_financiero.Entidades.Cliente>();

        public frm_Ver_Modificar_Prestamo(int _id_prestamo, string nombre, string apellido)
        {
            InitializeComponent();
            id_prestamo = _id_prestamo;
            using (PgSqlConnection conexion = new PgSqlConnection(frm_Menu.conexion))
            {

                conexion.Unicode = true;
                conexion.Open();
                string sql = "select * from \"Prestamo\" where id_prestamo = "+ Convert.ToString(_id_prestamo);
                PgSqlCommand comando = new PgSqlCommand(sql, conexion);
                PgSqlDataReader reader = comando.ExecuteReader();
                reader.Read();

                tbx_Num_prestamo.Text = Convert.ToString(reader[0]);
                tbx_Num_cliente.Text = Convert.ToString(reader[1]);
                tbx_Nombre.Text = nombre;
                tbx_Apellido.Text = apellido;
                tbx_Importe.Text = Convert.ToString(reader[2]);
                tbx_Instituto_informe.Text = Convert.ToString(reader[3]);
                mtbx_Sellado.Text = Decimal_completo(Convert.ToString(reader[4]));
                tbx_Numero_cuotas.Text = Convert.ToString(reader[5]);
                mtbx_TEM.Text = Decimal_completo(Convert.ToString(reader[6]));
                tbx_Comision_fija.Text = Convert.ToString(reader[7]);
                tbx_Comision_por_cuota.Text = Convert.ToString(reader[8]);
                mtbx_Punitorio.Text = Decimal_completo(Convert.ToString(reader[9]));
                mtbx_Fecha.Text = Convert.ToString(reader[10]);
                tbx_Hora.Text = Convert.ToString(reader[11]);
                tbx_Descuento.Text = Convert.ToString(reader[12]);
                mtbx_Alicuota_iva.Text = Decimal_completo(Convert.ToString(reader[13]));

                sql = "select * from \"Estado_prestamo\" where id_estado_prestamo = " + Convert.ToString(reader[14]);
                comando = new PgSqlCommand(sql, conexion);
                reader = comando.ExecuteReader();
                reader.Read();
                //tbx_Estado.BackColor = Color.SpringGreen;
                tbx_Estado.Text = Convert.ToString(reader[1]);

                // Garantes
                sql = "select * from \"Prestamo_Garante\" as p, \"Cliente\" as c where p.id_garante = c.id_cliente and id_prestamo = " + Convert.ToString(id_prestamo);
                comando = new PgSqlCommand(sql, conexion);
                reader = comando.ExecuteReader();
                Entidades.Cliente garante;
                while (reader.Read())
                {
                    garante = new Sistema_financiero.Entidades.Cliente();
                    garante.ID = Convert.ToInt32(reader[2]);
                    garante.Apellido = Convert.ToString(reader[3]);
                    garante.Nombres = Convert.ToString(reader[4]);
                    Lista_garantes.Add(garante);
                }

                dgv_Garantes.DataSource = null;
                dgv_Garantes.DataSource = Lista_garantes;
                for (int i = 0; i < dgv_Garantes.ColumnCount; i++)
                {
                    if (i == 1 || i == 2)
                    {
                        dgv_Garantes.Columns[i].Visible = true;
                    }
                    else
                    {
                        dgv_Garantes.Columns[i].Visible = false;
                    }
                }

                dgv_Garantes.AutoResizeColumns();
                
                conexion.Close();
                
            }

            

            
        }

        public void Actualizar_pagos()
        {
            int Ultima_cuota;
            Ultima_cuota = 1;
            //Actualizar color de grilla          

            for (int i = 1; i <= dgv_Cuota.RowCount; i++)
            {
                DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                Cuota_pagar.DefaultCellStyle.BackColor = Color.White;
            }

            if (Lista_pagos_mas_realizados.Count > 0)
            {
                decimal monto_pagado;
                monto_pagado = 0;
                decimal monto;
                monto = 0;
                int cuota;
                cuota = 0;
                bool pagado_completo;
                pagado_completo = false;

                monto_pagado = Importe_total_pagado();

                foreach (Entidades.Cuota C in Lista_cuotas)
                {
                    monto = monto + C.Total;
                    if (monto <= monto_pagado)
                    {
                        cuota = cuota + 1;
                        if (monto == monto_pagado)
                        {
                            pagado_completo = true;
                        }
                        else
                        {
                            pagado_completo = false;
                        }
                    }
                    else
                    {
                        DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[0];
                        Cuota_pagar.DefaultCellStyle.BackColor = Color.LemonChiffon;
                    }

                }

                if (cuota > 0)
                {
                    for (int i = 1; i <= cuota; i++)
                    {
                        if (i == cuota)
                        {
                            DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                            dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota - 1].Cells[1];
                            Cuota_pagar.DefaultCellStyle.BackColor = Color.SpringGreen;
                            if (Lista_cuotas.Count > cuota)
                            {
                                Ultima_cuota = cuota + 1;
                            }
                            else
                            {
                                Ultima_cuota = cuota;
                            }

                            if (pagado_completo == false)
                            {
                                dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota - 1].Cells[1];
                                DataGridViewRow Cuota_pagar2 = dgv_Cuota.Rows[i];
                                Cuota_pagar2.DefaultCellStyle.BackColor = Color.LemonChiffon;
                            }

                        }
                        else
                        {
                            dgv_Cuota.CurrentCell = dgv_Cuota.Rows[cuota - 1].Cells[1];
                            DataGridViewRow Cuota_pagar = dgv_Cuota.Rows[i - 1];
                            Cuota_pagar.DefaultCellStyle.BackColor = Color.SpringGreen;
                            Ultima_cuota = cuota;
                        }
                    }
                }

            }
            else
            {


            }
            dgv_Cuota.RowHeadersVisible = false;
            dgv_Cuota.ClearSelection();

        }

        public string Decimal_completo(string cadena)
        {
            while (cadena.Length < 5)
            {
                cadena = cadena + "0";
            }
            return cadena;
        }

        public decimal Importe_total_pagado()
        {
            decimal monto;
            monto = 0;
            foreach (Entidades.Pago P in Lista_pagos_mas_realizados)
            {
                monto = monto + P.Valor;
            }
            return monto;
        }

        public decimal Importe_total_cuotas()
        {
            decimal monto;
            monto = 0;
            foreach (Entidades.Cuota C in Lista_cuotas)
            {
                monto = monto + C.Total;
            }
            return monto;
        }

        public decimal Importe_hasta_cuota(int cuota_actual)
        {
            decimal monto;
            decimal monto_cuota_anterior;
            monto = 0;
            monto_cuota_anterior = 0;
            foreach (Entidades.Cuota C in Lista_cuotas)
            {
                if (C.Num_cuota <= cuota_actual - 1)
                {
                    monto_cuota_anterior = monto_cuota_anterior + C.Total;
                }
                if (C.Num_cuota <= cuota_actual)
                {
                    monto = monto + C.Total;
                }
                else
                {
                    break;
                }
            }
            if (Importe_total_pagado() <= monto)
            {
                if ((monto_cuota_anterior - Importe_total_pagado()) != 0)
                {
                    if ((Importe_total_pagado() - Lista_cuotas[cuota_actual - 1].Total) > 0)
                    {
                        if ((Importe_total_pagado() - (Lista_cuotas[cuota_actual - 1].Total + monto_cuota_anterior)) >= 0)
                        {
                            monto = (Importe_total_pagado() - ((Lista_cuotas[cuota_actual - 1].Total) + monto_cuota_anterior));
                        }
                        else
                        {
                            monto = Importe_total_pagado() - Lista_cuotas[cuota_actual - 1].Total;
                            if (monto > Lista_cuotas[cuota_actual - 1].Total)
                            {
                                monto = monto - monto_cuota_anterior;
                                monto = Lista_cuotas[cuota_actual - 1].Total + monto;
                            }
                        }
                    }
                    else
                    {
                        monto = (Importe_total_pagado() - monto_cuota_anterior);
                    }
                }
                else
                {
                    monto = 0;
                }
            }
            else
            {
                monto = Importe_total_pagado() - monto;
            }
            return monto;
        }

        private void btn_Cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frm_Ver_Modificar_Prestamo_Load(object sender, EventArgs e)
        {
            cbEstado.DataSource = Entidades.Estado_prestamo.Obtener_Estado_prestamo();
            cbEstado.DisplayMember = "Descripcion";
            cbEstado.ValueMember = "ID";

            Lista_cuotas = Entidades.Cuota.Obtener_Cuotas(id_prestamo);
            Lista_pagos = Entidades.Pago.Obtener_pagos(id_prestamo);
            Lista_pagos_mas_realizados = Lista_pagos;

            dgv_Cuota.DataSource = null;
            dgv_Cuota.DataSource = Lista_cuotas;

            dgv_Cuota.AutoResizeColumns();
            dgv_Cuota.Columns[0].Visible = false;

            Actualizar_pagos();
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            using (PgSqlConnection conexion = new PgSqlConnection(frm_Menu.conexion))
            {
                conexion.Unicode = true;
                conexion.Open();

                string sql = String.Format("UPDATE \"Prestamo\" SET id_estado_prestamo = " + Convert.ToInt32(cbEstado.SelectedValue) + " WHERE id_prestamo = " + Convert.ToString(id_prestamo));
                PgSqlCommand comando = new PgSqlCommand(sql, conexion);
                PgSqlDataReader reader = comando.ExecuteReader();
                reader.Read();

                tbx_Estado.Text = cbEstado.Text;

                sql = "INSERT INTO \"Historial_estado_prestamo\" VALUES ('" + Convert.ToString(id_prestamo) + "', '" + DateTime.Now.Date.ToString("d") + "' , '" + Convert.ToString(DateTime.Now.TimeOfDay) + "' , '" + Convert.ToInt32(cbEstado.SelectedValue) + "')";
                comando = new PgSqlCommand(sql, conexion);
                reader = comando.ExecuteReader();
                reader.Read();
                conexion.Close();


            }
        }

        private void btn_Ver_Click(object sender, EventArgs e)
        {
            if (dgv_Garantes.RowCount != 0 && dgv_Garantes.CurrentRow != null)
            {
                int id_garante = Convert.ToInt32(dgv_Garantes[0, dgv_Garantes.CurrentRow.Index].Value);
                frm_Ver_Garante ver_garante = new frm_Ver_Garante(id_garante);
                ver_garante.ShowDialog();
            }
        }

    }
}
